import java.io.*;
import java.util.*;

public class PhoneBookManagerImpl implements PhoneBookManager { // 电话簿管理实现类，实现PhoneBookManager接口中定义的所有方法
    private List<Contact> contacts = new ArrayList<>(); // 存储所有联系人的列表，ArrayList是动态数组
    private final String dataFile = "contacts_test_data.txt"; // 数据文件名，final表示不可修改

    public PhoneBookManagerImpl() {
        loadFromFile();
    } // 构造函数，创建对象时自动从文件加载数据

    @Override
    public boolean addContact(Contact contact) { // 添加联系人方法，@Override表示重写接口方法
        if (contact == null || !contact.isValid())
            return false; // 验证联系人对象是否有效
        for (Contact c : contacts) { // 遍历现有联系人，检查是否重复
            if (c.getName().equals(contact.getName()) && c.getPhoneNumber().equals(contact.getPhoneNumber())) {
                return false; // 如果姓名和电话都相同，认为是重复联系人
            }
        }
        contacts.add(contact);
        saveToFile();
        return true; // 添加联系人到列表并保存到文件
    }

    @Override
    public boolean deleteContact(String name) { // 根据姓名删除联系人
        if (name == null || name.trim().isEmpty())
            return false; // 验证姓名参数
        boolean removed = contacts.removeIf(c -> c.getName().equals(name.trim())); // removeIf删除满足条件的元素
        if (removed)
            saveToFile();
        return removed; // 如果删除成功则保存文件
    }

    @Override
    public boolean deleteContact(String name, String phoneNumber) { // 根据姓名和电话精确删除联系人
        if (name == null || phoneNumber == null)
            return false; // 验证两个参数都不为空
        boolean removed = contacts
                .removeIf(c -> c.getName().equals(name.trim()) && c.getPhoneNumber().equals(phoneNumber.trim())); // 同时匹配姓名和电话
        if (removed)
            saveToFile();
        return removed; // 删除成功后保存文件
    }

    @Override
    public boolean updateContact(String oldName, Contact newContact) { // 修改联系人信息
        if (oldName == null || newContact == null || !newContact.isValid())
            return false; // 验证参数有效性
        for (int i = 0; i < contacts.size(); i++) { // 使用索引遍历，因为需要替换元素
            if (contacts.get(i).getName().equals(oldName.trim())) { // 找到要修改的联系人
                contacts.set(i, newContact);
                saveToFile();
                return true; // 用新联系人替换旧联系人
            }
        }
        return false; // 如果没找到要修改的联系人
    }

    @Override
    public List<Contact> findContactsByName(String name) { // 根据姓名模糊查找联系人
        if (name == null || name.trim().isEmpty())
            return new ArrayList<>(); // 空参数返回空列表
        List<Contact> result = new ArrayList<>(); // 创建结果列表存储找到的联系人
        for (Contact c : contacts) { // 遍历所有联系人
            if (c.getName().toLowerCase().contains(name.trim().toLowerCase()))
                result.add(c); // 忽略大小写进行模糊匹配
        }
        return result; // 返回匹配的联系人列表
    }

    @Override
    public Contact findContactByPhone(String phoneNumber) { // 根据电话号码精确查找联系人
        if (phoneNumber == null || phoneNumber.trim().isEmpty())
            return null; // 验证电话号码参数
        for (Contact c : contacts) { // 遍历所有联系人
            if (c.getPhoneNumber().equals(phoneNumber.trim()))
                return c; // 找到匹配的电话号码就返回
        }
        return null; // 没找到返回null
    }

    @Override
    public List<Contact> getAllContacts() {
        return new ArrayList<>(contacts);
    } // 返回所有联系人的副本，防止外部修改原列表

    @Override
    public int getContactCount() {
        return contacts.size();
    } // 返回联系人总数

    @Override
    public void clearAllContacts() {
        contacts.clear();
        saveToFile();
    } // 清空所有联系人并保存文件

    @Override
    public boolean saveToFile() { // 保存联系人数据到文件
        try (PrintWriter writer = new PrintWriter(new FileWriter(dataFile))) { // try-with-resources自动关闭文件
            for (Contact c : contacts) { // 遍历所有联系人
                writer.printf("%s,%s,%d,%s,%s,%s%n", c.getName(), c.getGender(), c.getAge(), // 以CSV格式保存数据
                        c.getAddress() != null ? c.getAddress() : "", c.getPhoneNumber(), // 地址为空时保存空字符串
                        c.getEmail() != null ? c.getEmail() : ""); // 邮箱为空时保存空字符串
            }
            return true; // 保存成功
        } catch (IOException e) {
            return false;
        } // 捕获IO异常，保存失败
    }

    @Override
    public boolean loadFromFile() { // 从文件加载联系人数据
        File file = new File(dataFile); // 创建文件对象
        if (!file.exists())
            return true; // 文件不存在不算错误
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) { // 创建文件读取器
            String line;
            contacts.clear(); // 声明行变量，清空现有联系人
            while ((line = reader.readLine()) != null) { // 逐行读取文件内容
                String[] parts = line.split(",", 6); // 按逗号分割，最多分6部分
                if (parts.length >= 5) { // 至少要有5个字段（姓名、性别、年龄、地址、电话）
                    String name = parts[0], gender = parts[1];
                    int age = Integer.parseInt(parts[2]); // 解析基本信息
                    String address = parts[3].isEmpty() ? null : parts[3], phone = parts[4]; // 地址为空则设为null
                    String email = parts.length > 5 && !parts[5].isEmpty() ? parts[5] : null; // 邮箱为空则设为null
                    Contact contact = new Contact(name, gender, age, address, phone, email); // 创建联系人对象
                    if (contact.isValid())
                        contacts.add(contact); // 验证有效后添加到列表
                }
            }
            return true; // 加载成功
        } catch (IOException | NumberFormatException e) {
            return false;
        } // 捕获IO异常和数字转换异常
    }

    @Override
    public boolean exportToTxt(String fileName) { // 导出联系人到指定文件
        try (PrintWriter writer = new PrintWriter(new FileWriter(fileName))) { // 创建文件写入器
            for (Contact c : contacts)
                writer.println(c.toString()); // 将每个联系人的字符串表示写入文件
            return true; // 导出成功
        } catch (IOException e) {
            return false;
        } // 捕获IO异常
    }

    @Override
    public boolean importFromTxt(String fileName, boolean append) {
        return false;
    } // 简化版本不实现导入功能
}